2. 编码格式
2.1 长度编码
低位长度编码优先于 opcode:
| 匹配 | 宽度 |
|---|---|
(w0 & 0x1) == 0x0 | 32 位 |
(w0 & 0x3) == 0x1 | 64 位 |
w0[1:0] = 11 保留(v0.1 非法,留给更长的指令)。PC 按字节计数、始终 4 字节对齐;顺序执行时 PC +4 或 +8。
2.2 格式表(28 种)
位图范围为 [msb:lsb];opcode、fN 等固定字段由 YAML 指令项决定;既不是固定字段也不是操作数的位必须为零(reserved-must-be-zero)。
| 格式 | 宽度 | 位图(高位在左) | 用途 |
|---|---|---|---|
R | 32 | f4[31:28] rs2[27:21] rs1[20:14] rd[13:7] opcode[6:0] | 向量三源 |
RU | 32 | f5[31:27] rs2[26:21] rs1[20:14] rd[13:7] opcode[6:0] | 向量 + uniform 源 |
I8 | 32 | imm[31:24] f3[23:21] rs1[20:14] rd[13:7] opcode[6:0] | 8 位立即数 |
R1 | 32 | f11[31:21] rs1[20:14] rd[13:7] opcode[6:0] | 向量一元 |
R1U | 32 | f12[31:20] rs1[19:14] rd[13:7] opcode[6:0] | 向量目的、uniform 源 |
LI | 32 | imm[31:14] rd[13:7] opcode[6:0] | 向量立即数 |
C | 32 | f5[31:27] rs2[26:20] rs1[19:13] rd[12:7] opcode[6:0] | 向量 → uniform(比较 / 归约) |
CU | 32 | f6[31:26] rs2[25:20] rs1[19:13] rd[12:7] opcode[6:0] | 向量 + uniform → uniform |
CI | 32 | imm[31:24] f4[23:20] rs1[19:13] rd[12:7] opcode[6:0] | uniform 结果 + 立即数 |
UR | 32 | f7[31:25] rs2[24:19] rs1[18:13] rd[12:7] opcode[6:0] | 三 uniform 源 |
UI | 32 | imm[31:22] f3[21:19] rs1[18:13] rd[12:7] opcode[6:0] | uniform + 10 位立即数 |
U1 | 32 | f13[31:19] rs1[18:13] rd[12:7] opcode[6:0] | uniform 一元 / EXEC / 片段控制 |
ULI | 32 | imm[31:15] f2[14:13] rd[12:7] opcode[6:0] | uniform 立即数 / PC 相对 |
J | 32 | imm[31:10] f3[9:7] opcode[6:0] | 无条件 PC 相对跳转 |
JL | 32 | imm[31:13] rd[12:7] opcode[6:0] | 跳转并链接 |
B | 32 | imm[31:15] f2[14:13] rs1[12:7] opcode[6:0] | uniform 条件分支 |
JR | 32 | imm[31:22] f3[21:19] rs1[18:13] rd[12:7] opcode[6:0] | 间接跳转 / 返回 |
SYS | 32 | imm[31:12] f5[11:7] opcode[6:0] | 系统 / 屏障 / cache 控制 |
WAIT | 32 | sm[31:30] sfu[29:27] ls[26:23] vst[22:18] tex[17:13] vm[12:7] opcode[6:0] | 多计数器 waitcnt |
CSR | 32 | csr[31:22] f3[21:19] rs1[18:13] rd[12:7] opcode[6:0] | CSR 访问 |
X | 64 | z[63:55] sat[54:54] abs[53:51] neg[50:48] rm[47:45] f10[44:35] rs3[34:28] rs2[27:21] rs1[20:14] rd[13:7] opcode[6:0] | 三源 VALU + FP 修饰(neg/abs/sat/rm) |
XL | 64 | imm[63:32] f11[31:21] rs1[20:14] rd[13:7] opcode[6:0] | VALU + 32 位 literal |
H | 64 | z[63:59] sat[58:58] abs[57:55] neg[54:52] rm[51:49] f10[48:39] rs3[38:31] rs2[30:23] rs1[22:15] rd[14:7] opcode[6:0] | half/b16 VALU(16 位半寄存器) |
HC | 64 | z1[63:41] f10[40:31] rs2[30:23] rs1[22:15] z0[14:13] rd[12:7] opcode[6:0] | 16 位比较 → uniform 掩码 |
UL | 64 | imm[63:32] f13[31:19] rs1[18:13] rd[12:7] opcode[6:0] | uniform + 32 位 literal |
M | 64 | imm[63:40] f2[39:38] cpol[37:35] sp[34:32] f5[31:27] rs2[26:21] rs1[20:14] rd[13:7] opcode[6:0] | 向量内存 |
UM | 64 | z[63:59] cpol[58:56] imm[55:32] f7[31:25] rs2[24:19] rs1[18:13] rd[12:7] opcode[6:0] | uniform 标量内存 |
T | 64 | toff[63:52] z[51:50] d16[49:49] a16[48:48] rsd[47:47] voff[46:46] dmask[45:42] dim[41:38] rs3[37:32] f5[31:27] rs2[26:21] rs1[20:14] rd[13:7] opcode[6:0] | texture / image |
2.3 解码规则
字 w 解码为某指令 iff (w & (mask | zero)) == match;mask 来自该指令的 fixed,zero 是所有既非固定又非操作数的字段位并集。任意两条同宽指令编码不重叠。勘误 v0.1.2:保留操作数编码(rm = 5/6、cpol = 4..7、lane7 ≥ 32、奇数寄存器对、未对齐 udesc4)不由解码器拒绝,而是在执行时报 IllegalInsn(cause 1,trapinfo = 指令低 32 位)。
2.4 操作数类型
| 类型 | class | 位 | scale | 说明 / 取值 |
|---|---|---|---|---|
vreg | vreg | 7 | - | 向量寄存器 v0..v127 |
vpair | vreg | 7 | - | 64 位向量对 v[2n:2n+1](偶对齐) |
vreg16 | vreg | 8 | - | 16 位半:raw[7:1] 寄存器号、raw[0] 选半(0=.l / 1=.h) |
ureg | ureg | 6 | - | uniform 寄存器 u0..u63 |
upair | ureg | 6 | - | 64 位 uniform 对 u[2n:2n+1] |
udesc4 | ureg | 6 | - | 4-dword 描述符 u[4n:4n+3](buffer/sampler) |
udesc8 | ureg | 6 | - | 8-dword 描述符 u[4n:4n+7](image) |
simm8 | simm | 8 | - | 8 位有符号立即数(汇编值已乘 scale) |
uimm8 | uimm | 8 | - | 8 位无符号立即数(汇编值已乘 scale) |
simm10 | simm | 10 | - | 10 位有符号立即数(汇编值已乘 scale) |
simm17 | simm | 17 | - | 17 位有符号立即数(汇编值已乘 scale) |
simm18 | simm | 18 | - | 18 位有符号立即数(汇编值已乘 scale) |
simm24 | simm | 24 | - | 24 位有符号立即数(汇编值已乘 scale) |
imm32 | imm | 32 | - | 原始 32 位 literal(整数或 fp32 位模式) |
uimm1 | uimm | 1 | - | 1 位无符号立即数(汇编值已乘 scale) |
uimm3 | uimm | 3 | - | 3 位无符号立即数(汇编值已乘 scale) |
uimm4 | uimm | 4 | - | 4 位无符号立即数(汇编值已乘 scale) |
uimm6 | uimm | 6 | - | 6 位无符号立即数(汇编值已乘 scale) |
uimm20 | uimm | 20 | - | 20 位无符号立即数(汇编值已乘 scale) |
lane7 | uimm | 7 | - | lane 号 0..31(32..127 保留) |
attr7 | uimm | 7 | - | 属性槽 = location*4 + component |
toff7 | uimm | 7 | 4 | tile 记录内 4 字节单位偏移 |
toff12 | uimm | 12 | - | 打包 texel 偏移:[3:0]=x [7:4]=y [11:8]=z(各 4 位有符号) |
br22 | simm | 22 | 4 | PC 相对字节偏移(scale=4,相对本指令地址) |
br19 | simm | 19 | 4 | PC 相对字节偏移(scale=4,相对本指令地址) |
br17 | simm | 17 | 4 | PC 相对字节偏移(scale=4,相对本指令地址) |
jofs10 | simm | 10 | 4 | 加到寄存器目标的字节偏移(scale=4) |
cnt_vm | uimm | 6 | - | waitcnt 的 vm 字段 |
cnt_tex | uimm | 5 | - | waitcnt 的 tex 字段 |
cnt_vst | uimm | 5 | - | waitcnt 的 vst 字段 |
cnt_ls | uimm | 4 | - | waitcnt 的 ls 字段 |
cnt_sfu | uimm | 3 | - | waitcnt 的 sfu 字段 |
cnt_sm | uimm | 2 | - | waitcnt 的 sm 字段 |
rm | enum | 3 | - | 舍入模式:rne=0x0, rtz=0x1, rdn=0x2, rup=0x3, rmm=0x4, dyn=0x7 |
cpol | enum | 3 | - | cache 策略:def=0x0, nt=0x1, l2=0x2, sys=0x3 |
dim | enum | 4 | - | 图像维度:1d=0x0, 2d=0x1, 3d=0x2, cube=0x3, 1darray=0x4, 2darray=0x5, cubearray=0x6, 2dms=0x7, 2dmsarray=0x8, buffer=0x9 |
csr | enum | 10 | - | CSR 编号:exec=0x0, mode=0x1, fflags=0x2, trapctl=0x3, warpid=0x10, spid=0x11, coreid=0x12, wgslot=0x13, clock=0x20, clockh=0x21, time=0x22, timeh=0x23, scratch_lo=0x30, scratch_hi=0x31, scratch_size=0x32, code_lo=0x33, code_hi=0x34, trapbase=0x40, trapcause=0x41, trappc=0x42, trapinfo=0x43 |
mod3 | uimm | 3 | - | 源修饰位:bit0=s1、bit1=s2、bit2=s3(先 abs 后 neg) |
- 寄存器写法:
v5、u3;半寄存器v5.l/v5.h;寄存器组v[4:7]、u[8:15]。 simm/uimm汇编值为十进制且已乘scale;分支偏移br22/br19/br17(scale=4)是相对本指令地址的有符号字节偏移;jofs10加在寄存器目标上;toff7以 4 字节为单位。- 枚举:
rm= rne/rtz/rdn/rup/rmm/dyn(7);cpol= def/nt/l2/sys(4..7 保留);dim见 §7;csr编号见 §3.3。
2.5 谓词 / lane 模型
没有独立的谓词寄存器文件。EXEC 是 u 侧的 32 位 lane 掩码:向量指令默认受 EXEC 门控,除非标有 exec_ignored(uniform、控制或显式 lane 操作)、reads_exec(把 EXEC 当数据输入)或 writes_exec(修改 EXEC)。比较与归约的结果掩码只含 EXEC 内的 lane(非活跃位为 0,见勘误 v0.1.2 对 16 位整数比较的补充)。wqm/exec.wqm 将掩码扩展到 2x2 quad(每 4 位一组,任一位置位则整组置位)。needs_wqm 指令要求 helper lane 活跃(whole-quad mode);功能模型不实现 WQM 执行模式,由软件保证。
2.6 异步操作与 waitcnt
| 计数器 | 位 | 在途上限 | 顺序 | 覆盖 |
|---|---|---|---|---|
vm | 6 | 62 | in-order | 向量 load、返回原子、scratch load、L1/L2 invalidate |
vst | 5 | 30 | in-order | 向量 store、非返回原子、image store/atomic、L2 writeback |
tex | 5 | 30 | in-order | texture sample/fetch/query、image load、返回 image atomic |
ls | 4 | 14 | in-order | shared/tile memory、插值、zs.test |
sm | 2 | 15 | out-of-order | uniform 标量 load(乱序;只有 0 有意义) |
sfu | 3 | 6 | in-order | SFU 超越、除法、平方根 |
async:<counter>指令发射时递增计数器,结果提交后递减;一条指令算一个挂起操作,多寄存器结果(含 16 位半寄存器,带位掩码只写所选一半)一次写回。waitcnt各字段是"允许保留的最老序号阈值":vm/vst/tex/ls/sfu全 1(字段最大值)= 不等待,0 = 等待清空;sm为 2 位:0 = 清空标量内存队列、3 = 不等待、1/2 保留并按 0 处理(勘误 v0.1.1)。在途上限以 YAMLmax_outstanding为准(不能统一按 63),饱和时等同最老操作先完成(勘误 v0.1.2)。- 未用
waitcnt隔开的两个挂起写回写同一寄存器(WAW),或读取有挂起写回的寄存器(RAW),结果对软件未定义。endpgm按发射顺序完成全部挂起操作。 - 内存序:普通 global/buffer 访问按 program order 发射;
barrier在 workgroup 内建立 release/acquire(只覆盖 workgroup 存活 warp);跨 workgroup / device / system 顺序须由编译器插入waitcnt与 cache 维护。L1 write-through、命中时更新,store 计数在 L2 确认后递减;cpol=def/nt/l2/sys= 默认 / non-temporal / 强制 L2 / 系统级可见;host-coherent 页不进 L2。